/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Ultima revision: $Rev: 28 $
 *      Fecha: $Date: 2011-11-13 08:23:56 +0000 (Sun, 13 Nov 2011) $
 * 
 * Archivo: Servicios.java
 */

package Servicios;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Provee la manera de validar un usuario y obtener los tipos de servicios
 * que dicho usuario tiene registrados.
 * 
 * @author Jorge
 * @author Jonathan
 */
final public class Servicios {
    private ArrayList<iServidor> categoriasUsuario;
    private Usuario usuarioActual;
    private Datos proveedorDatos;
    
    /**
     * Constructor, inicializa los atributos a null.
     */
    public Servicios( Usuario usuario, Datos proveedorDatos ){
        categoriasUsuario = null;
        usuarioActual = null;
        this.proveedorDatos = proveedorDatos;
        
        cambiarUsuario( usuario );
    }
    
    /**
     * Devuelve un iEnlace que se puede utilizar para leer y escribir los campos
     * de un determinado servicio.
     * @param categoria Tipo al cual pertenece el Servicio pedido.
     * @param nombreServicio Nombre del Servicio pedido.
     * @return Un iEnlace, o null si no se encuentra el Servicio.
     */
    public iEnlace enlazar( String categoria, String nombreServicio ){
        // Validar
        if( !esValido() )
            return null;
        
        // Buscar la categoria y servicio
        for (iServidor servidor : categoriasUsuario) {
            if( servidor.obtenerNombreCategoria().equals(categoria) )
                return servidor.obtenerEnlace(nombreServicio);
        }
        
        // No se encontro el servicio.
        return null;
    }
    
    /**
     * Crea un nuevo usuario que puede utilizar los Servicios.
     * @param nuevoUsuario Nuevo usuario a agregar
     * @return True si la operación fue exitosa, false en caso contrario.
     */
    public boolean agregarUsuario( Usuario nuevoUsuario ){
        return proveedorDatos.agregarUsuario(nuevoUsuario);
    }
    
    /**
     * Cambia el usuario con el cual el objeto se encuentra registrado. Si el 
     * usuario es invalido entonces la instancia se queda en estado invalido.
     * @param nuevoUsuario
     * @return True si se encontro al usuario, y false en caso contrario.
     */
    public boolean cambiarUsuario( Usuario nuevoUsuario ){
        // Validar al usuario
        if( !proveedorDatos.validarUsuario(nuevoUsuario) )
            return false;
        usuarioActual = nuevoUsuario;
        
        // Obtener los servicios del usuario
        List<iServidor> categorias = Arrays.asList(proveedorDatos.obtenerCategorias(nuevoUsuario));
        categoriasUsuario = new ArrayList<iServidor>(categorias);
        
        return true;
    }
    
    /**
     * Comprueba si el usuario ingresado es un usuario valido.
     * @param usuarioComprobar
     * @return 
     */
    public boolean validarUsuario( Usuario usuarioComprobar ){
        return proveedorDatos.validarUsuario( usuarioComprobar );
    }
    
    /**
     * Cambia la contrasena de un usuario.
     * @param usuario
     * @param nuevaContrasena
     * @return 
     */
    public boolean cambiarContrasenaUsuario( Usuario usuario, String nuevaContrasena ){
        return proveedorDatos.cambiarContrasenaUsuario(usuario, nuevaContrasena);
    }
    
    /**
     * Agrega una nueva categoria a los Servicios del usuario.
     * @param nombreCategoria Nombre de la nueva categoria.
     * @return True si la categoria se pudo agregar, false en caso contrario.
     */
    public boolean agregarCategoria( String nombreCategoria ){
        // Validar 
        if( !esValido() )
            return false;
        
        iServidor nuevaCategoria = proveedorDatos.agregarCategoria(usuarioActual,
                nombreCategoria);
        if( nuevaCategoria == null )
            return false;
        
        // Agregar la categoria al arreglo
        if( !categoriasUsuario.contains(nuevaCategoria) )
            categoriasUsuario.add(nuevaCategoria);
        return true;
    }
    
    /**
     * Agrega un nuevo Servicio a la categoria dada. 
     * @param categoria Nombre de la Categoria a la que se le agregara el 
     * servicio.
     * @param nuevoServicio Nombre del nuevo servicio.
     * @return True si la operacion fue exitosa, false en caso contrario.
     * Devuelve True si el servicio ya existe.
     */
    public boolean agregarServicio( String categoria, String nuevoServicio ){
        // Validar
        if( !esValido() )
            return false;
        
        // Buscar la categoria
        for (iServidor categoriaActual : categoriasUsuario) {
            if( categoriaActual.obtenerNombreCategoria().equals(categoria) ){
                // Categoria encontrada
                return categoriaActual.agregarNuevoServicio(nuevoServicio);
            }
        }
        
        return false;
    }
    
    /**
     * @return Regresa true si los Servicios son validos, es decir, que 
     * se encuentre un usuario registrado y este tenga 0 o mas servicios.
     */
    public boolean esValido(){
        if( usuarioActual != null && categoriasUsuario != null )
            return true;
        else
            return false;
    }
    
    /**
     * @return Regresa un arreglo con el nombre de todos los Tipos de Servicios
     * que el usuario actual tiene registrado, o null si no hay ninguno.
     */
    public String[] obtenerNombreCategorias(){
        // Validar
        if( !esValido() )
            return null;
        
        // Obtener los nombres de las categorias de los servicios.
        ArrayList<String> categoriasServicios = new ArrayList<String>();
        for (iServidor servidorActual : categoriasUsuario) {
            categoriasServicios.add( servidorActual.obtenerNombreCategoria() );
        }
        
        return categoriasServicios.toArray( new String[0] );
    }
    
    /**
     * @param categoria Nombre de la Categoria que se quiere obtener.
     * @return Regresa un arreglo con el nombre de todos los Servicios
     * que el usuario actual tiene registrados, o null si no hay ninguno.
     */
    public String[] obtenerNombreServicios( String categoria ){
        // Validar
        if( !esValido() )
            return null;
        
        // Buscar el servidor
        iServidor s = null;
        for (iServidor servidorActual : categoriasUsuario) {
            if( categoria.equals(servidorActual.obtenerNombreCategoria()) ){
                s = servidorActual;
                break;
            }
        }
        
        if( s != null )
            return s.obtenerServiciosRegistrados();
        else
            return null;
    }
}
